/**
 * This base class demonstrates abstract base class detection
 * as well as callable objects, and now docstring generation
 * I hope
 */
struct A
{
    public:
        /**
         * doit is what make this abstract
         */
        virtual void doit() = 0;
        int doodad() { return 12; }
        bool operator () () {return false;};
};

struct B : public A
{
    /**
     * Makes a B
     */
    B()
    {}
    protected:
        virtual void doit() {}

    private:
        B(const B&);
};

/**
 * C is exposed as an interface to better test docstrings
 */
class C
{
    public:
    /**
     * Makes a C
     */
    C()
    {}

    virtual void fire(B & b)
    {}
    private:
        C(const C&);
};

int b_ping(B *)
{
    return 37;
}

void klunk(C & c, B & b)
{
    c.fire(b);
}
